GDK W32: send a DELETE selection when using LOCAL selection protocol
authorРуслан Ижбулатов <lrn1986@gmail.com>
Tue, 13 Mar 2018 18:21:50 +0000 (18:21 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Tue, 13 Mar 2018 18:21:50 +0000 (18:21 +0000)
This was not needed before, but now it seems to be necessary for
some reason. The code is just an adjusted copy of the appropriate
piece of the OLE2 protocol code, sending GDK_SELECTION_REQUEST.

The rest is just fixing the fallout, allowing LOCAL protocol to pass
the functions it wasn't supposed to pass before.

Closes #82

gdk/win32/gdkdnd-win32.c
gdk/win32/gdkproperty-win32.c
gdk/win32/gdkselection-win32.c

index d650a70d0d0873c35587eba96737c7c2553ac344..589aea5a8e7c8d20678c92602bb15f01babae761 100644 (file)
@@ -2566,6 +2566,23 @@ gdk_win32_drag_context_drop_finish (GdkDragContext *context,
                                           context->dest_window);
       if (src_context)
        {
+          if (gdk_drag_context_get_selected_action (src_context) == GDK_ACTION_MOVE)
+            {
+              tmp_event = gdk_event_new (GDK_SELECTION_REQUEST);
+              g_set_object (&tmp_event->selection.window, src_context->source_window);
+              tmp_event->selection.send_event = FALSE;
+              tmp_event->selection.selection = _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_LOCAL_DND_SELECTION);
+              tmp_event->selection.target = _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_DELETE);
+              sel_win32->property_change_target_atom = _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_DELETE);
+              tmp_event->selection.property = _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_LOCAL_DND_SELECTION);
+              g_set_object (&tmp_event->selection.requestor, src_context->source_window);
+              tmp_event->selection.time = GDK_CURRENT_TIME; /* ??? */
+
+              GDK_NOTE (EVENTS, _gdk_win32_print_event (tmp_event));
+              gdk_event_put (tmp_event);
+              gdk_event_free (tmp_event);
+            }
+
          tmp_event = gdk_event_new (GDK_DROP_FINISHED);
          g_set_object (&tmp_event->dnd.window, src_context->source_window);
          tmp_event->dnd.send_event = FALSE;
index 435bbe9d35be252e10d5e103ae4c81aa0adbde0e..06e8bb79fb0c1177bd9be66e341c9cc5304d0f0c 100644 (file)
@@ -186,7 +186,8 @@ _gdk_win32_window_change_property (GdkWindow         *window,
 #endif
 
   if (property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_GDK_SELECTION) ||
-      property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_OLE2_DND))
+      property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_OLE2_DND) ||
+      property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_LOCAL_DND_SELECTION))
     {
       _gdk_win32_selection_property_change (win32_sel,
                                             window,
index 41bab532bfecefc3c39a168be9e89f53598c9592..ff4b5c78998a61f7ec45728fd1d5a7e15b0e7b96 100644 (file)
@@ -2356,7 +2356,8 @@ _gdk_win32_selection_property_change (GdkWin32Selection *win32_sel,
           open_clipboard_timeout (NULL);
         }
     }
-  else if (property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_OLE2_DND) &&
+  else if ((property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_OLE2_DND) ||
+            property == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_LOCAL_DND_SELECTION)) &&
            mode == GDK_PROP_MODE_REPLACE &&
            win32_sel->property_change_target_atom == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_DELETE))
     {